atspi: Properly filter out parent actions
authorMatthias Clasen <mclasen@redhat.com>
Fri, 16 Oct 2020 01:29:37 +0000 (21:29 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 16 Oct 2020 01:32:11 +0000 (21:32 -0400)
We only want to show relevant, local actions for
widgets, but _gtk_widget_get_action_muxer() will
return the muxer of a parent widget (all the way
up to the toplevel), if the widget does not have
any actions of its own. To detect this situation,
compare what _gtk_widget_get_action_muxer() returns
for the parent widget, and act accordingly.

gtk/a11y/gtkatspiaction.c

index bcb74d594aeb53bf4122f3b34b66fdc79e70a223..2c28c0fbbd2cf4f1b833aa1912739f33fad12182 100644 (file)
@@ -678,12 +678,18 @@ widget_handle_method (GDBusConnection       *connection,
   GtkAtSpiContext *self = user_data;
   GtkAccessible *accessible = gtk_at_context_get_accessible (GTK_AT_CONTEXT (self));
   GtkWidget *widget = GTK_WIDGET (accessible);
+  GtkWidget *parent = gtk_widget_get_parent (widget);
   GtkActionMuxer *muxer = _gtk_widget_get_action_muxer (widget, FALSE);
+  GtkActionMuxer *parent_muxer = parent ? _gtk_widget_get_action_muxer (parent, FALSE) : NULL;
 
   if (muxer == NULL)
     return;
 
-  char **actions = gtk_action_muxer_list_actions (muxer, TRUE);
+  char **actions = NULL;
+
+  if (muxer != parent_muxer)
+    actions = gtk_action_muxer_list_actions (muxer, TRUE);
+
   int n_actions = actions != NULL ? g_strv_length (actions) : 0;
 
   /* XXX: We need more fields in the action API */
@@ -771,13 +777,19 @@ widget_handle_get_property (GDBusConnection  *connection,
   GtkAtSpiContext *self = user_data;
   GtkAccessible *accessible = gtk_at_context_get_accessible (GTK_AT_CONTEXT (self));
   GtkWidget *widget = GTK_WIDGET (accessible);
+  GtkWidget *parent = gtk_widget_get_parent (widget);
   GtkActionMuxer *muxer = _gtk_widget_get_action_muxer (widget, FALSE);
+  GtkActionMuxer *parent_muxer = parent ? _gtk_widget_get_action_muxer (parent, FALSE) : NULL;
   GVariant *res = NULL;
 
   if (muxer == NULL)
     return res;
 
-  char **actions = gtk_action_muxer_list_actions (muxer, TRUE);
+  char **actions = NULL;
+
+  if (muxer != parent_muxer)
+    actions = gtk_action_muxer_list_actions (muxer, TRUE);
+
   int n_actions = actions != NULL ? g_strv_length (actions) : 0;
 
   if (g_strcmp0 (property_name, "NActions") == 0)